<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        function foo(){
            // ....
        }
        // foo.prototype默认(在代码中第一行声明时!) 
        // 有一个公有并且不可枚举的属性 .constructor
        // 这个属性引用的是对象关联的函数(这里是foo)
        foo.prototype.constructor === foo;

        // new会劫持所有普通函数并用构造对象的形式来调用它
        // foo只是一个普通的函数 但在使用new调用时 它就会构造一个对象并赋值给a
        // 这看起来像是new的一个副作用(无论如何都会构造一个对象)
        // 这个调用是一个构造函数调用 但是 foo 本身并不是一个构造函数
        // 在JavaScript中对于"构造函数"最准确的解释是
        // 所有带new的函数调用
        // 函数不是构造函数 但是当且仅当使用new时 函数调用会变成"构造函数调用"
        var a = new foo();
        a;
    </script>
</body>
</html>